title: 犀利开发—jQuery内核详解与实践-9_jQ辅助工具
date: 2018.1.20
2018.1.20 星期六 22:59
P398-P400
$.browser 5个属性:safari,opera,msie,mozilla
缺乏灵活性,1.3本不建议使用
var userAgent=navigator.userAgent.toLowerCase()
jQuery.browser={
version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/:]([\d.]+)/)||[0,'0'])[1],
safari:/webkit/.test(userAgent),
opera:/opera/.test(userAgent),
msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),
mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/ .test(userAgent)
}
字符串检测法(上面,1.3不再支持了)
现在多,特征检测法
var d=do.creE('div')
d.st.wi=d.st.paddLe='1px'
do.body.appC(d)
var w=d.offsetWidth
d.st.disp='none'
do.body.reC(d)
return w===2
}trim(),param()
return (text||"").replace(/^\s+|\s+$/g,"")
}var s=[]
function add(key,val){
s[s.length]=encodeURIComponent(key)+'='+encodeURIComponent(value)
}
for(var j in a){
add(j,a[j])
}
return s.join("&").replace(/%20/g,"+")
}return Object.prototype.toString.call(obj)==="[object Array]"
}return Object.prototype.toString.call(obj)==="[object Function]"
}var name,i=0,length=obj.length
if(args){//如果存在第三个参数
if(length===undefined){//如果是对象
for(name in obj){
if(callback.apply(obj[name],args)===false)
break;//回调函数返回false,跳出循环
}
}else{//如果数组
for(;i<length;){
if(callback.apply(obj[i++],args)===false)
break
}
}
}else{
if(length===undefined){
for(name in object){
if(callback.call(obj[name],name,obj[name])===false)
break
}
}else{
for(var val=obj[0];i<length&&callback.call(val,i,val)!==false;
val=obj[i++]){}
}
}
return obj
}// EXCLUDE:上中有些没有用过,而且JS现在已经有很好的数组处理方法
noConflict:function(deep){
window.$=_$
if(deep)
window.jQuery=_jQuery
return jQuery
}
var expando='jQuery'+now(),uuid=0,windowData={}
jQuery.extend({
cache:{},
data:function(elem,name,data){
elem=elem==window?windowData:elem
var id=elem[expando]//为当前元素定义一个数据属性
if(!id){
id=elem[expando]=++uuid
}
//如果缓存数据对象中未存在特定数据的属性
if(name&&!jQuery.cahce[id]){
jQuery.cache[id]={}
}
if(data!==undefined){
jQuery.cache[id][name]=data
}
return name?jQuery.cache[id][name]:id
}
})
//下面JS模拟jQ实现方法,并通过示例看数据缓存的作用原理
var expando='jQuery'+now()
uuid=0
windowData={}
cache={}
function data(elem,name,data){
elem=elem==window?windowData:elem
var id=elem[expando]
if(!id) id=elem[expando]=++uuid
if(name&&!cache[id]) cache[id]={}
if(data!==undefined) cache[id][name]=data
return name?cache[id][name]:id
}
function now(){return +new Date}
//为方便jQ对象操作,有绑定到jQuery.fn原型对象上
jQuery.fn.extend({
data:function(key,value){}
})
// TODO:数据缓存,在数据方面实用。再研究
‘先进先出’ (FIFO: first in first out)
定义queue()方法实现对队列的完整操作
对于一系列需要按次序执行的函数特别有用:animate动画,Ajax异步请求,交互,ti’me’out
$div.queue(name,callback) //name 默认fx
// INCLUED:9.6_queue.html
$div.queue(name)
如果匹配的元素不止一个,则返回第一个元素的
$
$div.queue('fa',function(){})
$div.queue('fx',fa)
如果第二参数为空数组,会清除原来的动画序列
$(this).dequeue()
..
// 然后在jQuery.fn对象上绑定原型方法
each:function(callback,args){
return jQuery.each(this,callback,args)
}
jQuery.fn=jQuery.prototype={
size:function(){
return this.length
}
}
length属性,size()
selector,context 属性
var li=$li.get()//转换为DOM集合
li.reverse()
// CHECK:?返回的是jQ对象还是DOM
1.21 00:34
2018.1.21 日 22:34
P401-P423
// INCLUED:10_case.html,case.js,…
电子相册网站
// EXCLUDE:通过case.js知道是2017.7月份,看了本书1,2,10章节
//本章内容不错;但是实际,而且现在的工作内容中,更加丰富和变化
//基于现在的工作,没有价值;但是ajax的思想是一直存在的
1.21 23:52